mirror of
https://github.com/zaphar/kitchen.git
synced 2025-07-22 19:40:14 -04:00
Get rid of unnecessary create_effect calls
This commit is contained in:
parent
47fab33561
commit
a39ed5589f
@ -185,6 +185,7 @@ impl MessageMapper<Message, AppState> for StateMachine {
|
|||||||
#[instrument(skip_all, fields(?msg))]
|
#[instrument(skip_all, fields(?msg))]
|
||||||
fn map<'ctx>(&self, cx: Scope<'ctx>, msg: Message, original: &'ctx Signal<AppState>) {
|
fn map<'ctx>(&self, cx: Scope<'ctx>, msg: Message, original: &'ctx Signal<AppState>) {
|
||||||
let mut original_copy = original.get().as_ref().clone();
|
let mut original_copy = original.get().as_ref().clone();
|
||||||
|
debug!("handling state message");
|
||||||
match msg {
|
match msg {
|
||||||
Message::ResetRecipeCounts => {
|
Message::ResetRecipeCounts => {
|
||||||
let mut map = BTreeMap::new();
|
let mut map = BTreeMap::new();
|
||||||
|
@ -48,6 +48,7 @@ pub fn AddRecipe<'ctx, G: Html>(cx: Scope<'ctx>, sh: StateHandler<'ctx>) -> View
|
|||||||
)
|
)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// TODO(jwall): This create effect should no longer be necessary;
|
||||||
create_effect(cx, move || {
|
create_effect(cx, move || {
|
||||||
create_recipe_signal.track();
|
create_recipe_signal.track();
|
||||||
if !*dirty.get_untracked() {
|
if !*dirty.get_untracked() {
|
||||||
|
@ -43,7 +43,6 @@ fn check_category_text_parses(unparsed: &str, error_text: &Signal<String>) -> bo
|
|||||||
#[instrument(skip_all)]
|
#[instrument(skip_all)]
|
||||||
#[component]
|
#[component]
|
||||||
pub fn Categories<'ctx, G: Html>(cx: Scope<'ctx>, sh: StateHandler<'ctx>) -> View<G> {
|
pub fn Categories<'ctx, G: Html>(cx: Scope<'ctx>, sh: StateHandler<'ctx>) -> View<G> {
|
||||||
let save_signal = create_signal(cx, ());
|
|
||||||
let error_text = create_signal(cx, String::new());
|
let error_text = create_signal(cx, String::new());
|
||||||
let category_text: &Signal<String> = create_signal(cx, String::new());
|
let category_text: &Signal<String> = create_signal(cx, String::new());
|
||||||
let dirty = create_signal(cx, false);
|
let dirty = create_signal(cx, false);
|
||||||
@ -61,21 +60,6 @@ pub fn Categories<'ctx, G: Html>(cx: Scope<'ctx>, sh: StateHandler<'ctx>) -> Vie
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
create_effect(cx, move || {
|
|
||||||
save_signal.track();
|
|
||||||
if !*dirty.get() {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
spawn_local_scoped(cx, {
|
|
||||||
async move {
|
|
||||||
sh.dispatch(
|
|
||||||
cx,
|
|
||||||
Message::SetCategoryMap(category_text.get_untracked().as_ref().clone()),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
let dialog_view = view! {cx,
|
let dialog_view = view! {cx,
|
||||||
dialog(id="error-dialog") {
|
dialog(id="error-dialog") {
|
||||||
article{
|
article{
|
||||||
@ -102,10 +86,15 @@ pub fn Categories<'ctx, G: Html>(cx: Scope<'ctx>, sh: StateHandler<'ctx>) -> Vie
|
|||||||
check_category_text_parses(category_text.get().as_str(), error_text);
|
check_category_text_parses(category_text.get().as_str(), error_text);
|
||||||
}) { "Check" } " "
|
}) { "Check" } " "
|
||||||
span(role="button", on:click=move |_| {
|
span(role="button", on:click=move |_| {
|
||||||
// TODO(jwall): check and then save the categories.
|
if !*dirty.get() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if check_category_text_parses(category_text.get().as_str(), error_text) {
|
if check_category_text_parses(category_text.get().as_str(), error_text) {
|
||||||
debug!("triggering category save");
|
debug!("triggering category save");
|
||||||
save_signal.trigger_subscribers();
|
sh.dispatch(
|
||||||
|
cx,
|
||||||
|
Message::SetCategoryMap(category_text.get_untracked().as_ref().clone()),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}) { "Save" }
|
}) { "Save" }
|
||||||
}
|
}
|
||||||
|
@ -67,44 +67,8 @@ pub fn Editor<'ctx, G: Html>(cx: Scope<'ctx>, props: RecipeComponentProps<'ctx>)
|
|||||||
});
|
});
|
||||||
|
|
||||||
let id = create_memo(cx, || recipe.get().recipe_id().to_owned());
|
let id = create_memo(cx, || recipe.get().recipe_id().to_owned());
|
||||||
let save_signal = create_signal(cx, ());
|
|
||||||
let dirty = create_signal(cx, false);
|
let dirty = create_signal(cx, false);
|
||||||
|
|
||||||
debug!("Creating effect");
|
|
||||||
create_effect(cx, move || {
|
|
||||||
save_signal.track();
|
|
||||||
if !*dirty.get_untracked() {
|
|
||||||
debug!("Recipe text is unchanged");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
debug!("Recipe text is changed");
|
|
||||||
spawn_local_scoped(cx, {
|
|
||||||
let store = crate::api::HttpStore::get_from_context(cx);
|
|
||||||
async move {
|
|
||||||
debug!("Attempting to save recipe");
|
|
||||||
if let Err(e) = store
|
|
||||||
.save_recipes(vec![RecipeEntry(
|
|
||||||
id.get_untracked().as_ref().clone(),
|
|
||||||
text.get_untracked().as_ref().clone(),
|
|
||||||
)])
|
|
||||||
.await
|
|
||||||
{
|
|
||||||
error!(?e, "Failed to save recipe");
|
|
||||||
error_text.set(format!("{:?}", e));
|
|
||||||
} else {
|
|
||||||
// We also need to set recipe in our state
|
|
||||||
dirty.set(false);
|
|
||||||
if let Ok(recipe) = recipes::parse::as_recipe(text.get_untracked().as_ref()) {
|
|
||||||
sh.dispatch(
|
|
||||||
cx,
|
|
||||||
Message::SetRecipe(id.get_untracked().as_ref().to_owned(), recipe),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
debug!("creating editor view");
|
debug!("creating editor view");
|
||||||
view! {cx,
|
view! {cx,
|
||||||
div(class="grid") {
|
div(class="grid") {
|
||||||
@ -121,7 +85,36 @@ pub fn Editor<'ctx, G: Html>(cx: Scope<'ctx>, props: RecipeComponentProps<'ctx>)
|
|||||||
let unparsed = text.get();
|
let unparsed = text.get();
|
||||||
if check_recipe_parses(unparsed.as_str(), error_text, aria_hint) {
|
if check_recipe_parses(unparsed.as_str(), error_text, aria_hint) {
|
||||||
debug!("triggering a save");
|
debug!("triggering a save");
|
||||||
save_signal.trigger_subscribers();
|
if !*dirty.get_untracked() {
|
||||||
|
debug!("Recipe text is unchanged");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
debug!("Recipe text is changed");
|
||||||
|
spawn_local_scoped(cx, {
|
||||||
|
let store = crate::api::HttpStore::get_from_context(cx);
|
||||||
|
async move {
|
||||||
|
debug!("Attempting to save recipe");
|
||||||
|
if let Err(e) = store
|
||||||
|
.save_recipes(vec![RecipeEntry(
|
||||||
|
id.get_untracked().as_ref().clone(),
|
||||||
|
text.get_untracked().as_ref().clone(),
|
||||||
|
)])
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
error!(?e, "Failed to save recipe");
|
||||||
|
error_text.set(format!("{:?}", e));
|
||||||
|
} else {
|
||||||
|
// We also need to set recipe in our state
|
||||||
|
dirty.set(false);
|
||||||
|
if let Ok(recipe) = recipes::parse::as_recipe(text.get_untracked().as_ref()) {
|
||||||
|
sh.dispatch(
|
||||||
|
cx,
|
||||||
|
Message::SetRecipe(id.get_untracked().as_ref().to_owned(), recipe),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
}) { "Save" }
|
}) { "Save" }
|
||||||
|
@ -35,17 +35,6 @@ pub fn RecipePlan<'ctx, G: Html>(cx: Scope<'ctx>, sh: StateHandler<'ctx>) -> Vie
|
|||||||
}
|
}
|
||||||
rows
|
rows
|
||||||
});
|
});
|
||||||
let refresh_click = create_signal(cx, false);
|
|
||||||
let save_click = create_signal(cx, false);
|
|
||||||
// FIXME(jwall): We should probably make this a dispatch method instead.
|
|
||||||
create_effect(cx, move || {
|
|
||||||
refresh_click.track();
|
|
||||||
sh.dispatch(cx, Message::LoadState);
|
|
||||||
});
|
|
||||||
create_effect(cx, move || {
|
|
||||||
save_click.track();
|
|
||||||
sh.dispatch(cx, Message::SaveState);
|
|
||||||
});
|
|
||||||
view! {cx,
|
view! {cx,
|
||||||
table(class="recipe_selector no-print") {
|
table(class="recipe_selector no-print") {
|
||||||
(View::new_fragment(
|
(View::new_fragment(
|
||||||
@ -66,17 +55,14 @@ pub fn RecipePlan<'ctx, G: Html>(cx: Scope<'ctx>, sh: StateHandler<'ctx>) -> Vie
|
|||||||
))
|
))
|
||||||
}
|
}
|
||||||
input(type="button", value="Reset", on:click=move |_| {
|
input(type="button", value="Reset", on:click=move |_| {
|
||||||
// Poor man's click event signaling.
|
sh.dispatch(cx, Message::LoadState);
|
||||||
let toggle = !*refresh_click.get();
|
|
||||||
refresh_click.set(toggle);
|
|
||||||
})
|
})
|
||||||
input(type="button", value="Clear All", on:click=move |_| {
|
input(type="button", value="Clear All", on:click=move |_| {
|
||||||
sh.dispatch(cx, Message::ResetRecipeCounts);
|
sh.dispatch(cx, Message::ResetRecipeCounts);
|
||||||
})
|
})
|
||||||
input(type="button", value="Save Plan", on:click=move |_| {
|
input(type="button", value="Save Plan", on:click=move |_| {
|
||||||
// Poor man's click event signaling.
|
// Poor man's click event signaling.
|
||||||
let toggle = !*save_click.get();
|
sh.dispatch(cx, Message::SaveState);
|
||||||
save_click.set(toggle);
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ pub fn RecipeSelection<'ctx, G: Html>(
|
|||||||
view! {cx,
|
view! {cx,
|
||||||
div() {
|
div() {
|
||||||
label(for=for_id) { a(href=href) { (*title) } }
|
label(for=for_id) { a(href=href) { (*title) } }
|
||||||
input(type="number", class="item-count-sel", min="0", value=count, name=name, on:change=move |_| {
|
input(type="number", class="item-count-sel", min="0", bind:value=count, name=name, on:change=move |_| {
|
||||||
debug!(idx=%id, count=%(*count.get()), "setting recipe count");
|
debug!(idx=%id, count=%(*count.get()), "setting recipe count");
|
||||||
sh.dispatch(cx, Message::UpdateRecipeCount(id.as_ref().clone(), count.get().parse().expect("Count is not a valid usize")));
|
sh.dispatch(cx, Message::UpdateRecipeCount(id.as_ref().clone(), count.get().parse().expect("Count is not a valid usize")));
|
||||||
})
|
})
|
||||||
|
@ -192,12 +192,6 @@ fn make_shopping_table<'ctx, G: Html>(
|
|||||||
#[component]
|
#[component]
|
||||||
pub fn ShoppingList<'ctx, G: Html>(cx: Scope<'ctx>, sh: StateHandler<'ctx>) -> View<G> {
|
pub fn ShoppingList<'ctx, G: Html>(cx: Scope<'ctx>, sh: StateHandler<'ctx>) -> View<G> {
|
||||||
let show_staples = create_signal(cx, true);
|
let show_staples = create_signal(cx, true);
|
||||||
let save_click = create_signal(cx, ());
|
|
||||||
create_effect(cx, move || {
|
|
||||||
save_click.track();
|
|
||||||
info!("Registering save request for inventory");
|
|
||||||
sh.dispatch(cx, Message::SaveState);
|
|
||||||
});
|
|
||||||
view! {cx,
|
view! {cx,
|
||||||
h1 { "Shopping List " }
|
h1 { "Shopping List " }
|
||||||
label(for="show_staples_cb") { "Show staples" }
|
label(for="show_staples_cb") { "Show staples" }
|
||||||
@ -209,8 +203,9 @@ pub fn ShoppingList<'ctx, G: Html>(cx: Scope<'ctx>, sh: StateHandler<'ctx>) -> V
|
|||||||
input(type="button", value="Reset", class="no-print", on:click=move |_| {
|
input(type="button", value="Reset", class="no-print", on:click=move |_| {
|
||||||
sh.dispatch(cx, Message::ResetInventory);
|
sh.dispatch(cx, Message::ResetInventory);
|
||||||
})
|
})
|
||||||
input(type="button", value="Save", class="no-print", on:click=|_| {
|
input(type="button", value="Save", class="no-print", on:click=move |_| {
|
||||||
save_click.trigger_subscribers();
|
info!("Registering save request for inventory");
|
||||||
|
sh.dispatch(cx, Message::SaveState);
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,8 @@
|
|||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
use sycamore::{futures::spawn_local_scoped, prelude::*};
|
use sycamore::futures::spawn_local_scoped;
|
||||||
|
use sycamore::prelude::*;
|
||||||
use tracing::{debug, info};
|
use tracing::{debug, info};
|
||||||
|
|
||||||
use crate::app_state::{Message, StateHandler};
|
use crate::app_state::{Message, StateHandler};
|
||||||
@ -20,20 +21,6 @@ use crate::app_state::{Message, StateHandler};
|
|||||||
pub fn LoginForm<'ctx, G: Html>(cx: Scope<'ctx>, sh: StateHandler<'ctx>) -> View<G> {
|
pub fn LoginForm<'ctx, G: Html>(cx: Scope<'ctx>, sh: StateHandler<'ctx>) -> View<G> {
|
||||||
let username = create_signal(cx, "".to_owned());
|
let username = create_signal(cx, "".to_owned());
|
||||||
let password = create_signal(cx, "".to_owned());
|
let password = create_signal(cx, "".to_owned());
|
||||||
let clicked = create_signal(cx, ("".to_owned(), "".to_owned()));
|
|
||||||
create_effect(cx, move || {
|
|
||||||
let (username, password) = (*clicked.get()).clone();
|
|
||||||
if username != "" && password != "" {
|
|
||||||
spawn_local_scoped(cx, async move {
|
|
||||||
let store = crate::api::HttpStore::get_from_context(cx);
|
|
||||||
debug!("authenticating against ui");
|
|
||||||
// TODO(jwall): Navigate to plan if the below is successful.
|
|
||||||
if let Some(user_data) = store.authenticate(username, password).await {
|
|
||||||
sh.dispatch(cx, Message::SetUserData(user_data));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
view! {cx,
|
view! {cx,
|
||||||
form() {
|
form() {
|
||||||
label(for="username") { "Username" }
|
label(for="username") { "Username" }
|
||||||
@ -42,9 +29,18 @@ pub fn LoginForm<'ctx, G: Html>(cx: Scope<'ctx>, sh: StateHandler<'ctx>) -> View
|
|||||||
input(type="password", bind:value=password)
|
input(type="password", bind:value=password)
|
||||||
input(type="button", value="Login", on:click=move |_| {
|
input(type="button", value="Login", on:click=move |_| {
|
||||||
info!("Attempting login request");
|
info!("Attempting login request");
|
||||||
clicked.set(((*username.get_untracked()).clone(), (*password.get_untracked()).clone()));
|
let (username, password) = ((*username.get_untracked()).clone(), (*password.get_untracked()).clone());
|
||||||
|
if username != "" && password != "" {
|
||||||
|
spawn_local_scoped(cx, async move {
|
||||||
|
let store = crate::api::HttpStore::get_from_context(cx);
|
||||||
|
debug!("authenticating against ui");
|
||||||
|
// TODO(jwall): Navigate to plan if the below is successful.
|
||||||
|
if let Some(user_data) = store.authenticate(username, password).await {
|
||||||
|
sh.dispatch(cx, Message::SetUserData(user_data));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
debug!("triggering login click subscribers");
|
debug!("triggering login click subscribers");
|
||||||
clicked.trigger_subscribers();
|
|
||||||
}) { }
|
}) { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,8 +28,6 @@ pub fn UI<G: Html>(cx: Scope) -> View<G> {
|
|||||||
let app_state = crate::app_state::AppState::new();
|
let app_state = crate::app_state::AppState::new();
|
||||||
let sh = crate::app_state::get_state_handler(cx, app_state, store);
|
let sh = crate::app_state::get_state_handler(cx, app_state, store);
|
||||||
let view = create_signal(cx, View::empty());
|
let view = create_signal(cx, View::empty());
|
||||||
// FIXME(jwall): We need a way to trigger refreshes when required. Turn this
|
|
||||||
// into a create_effect with a refresh signal stored as a context.
|
|
||||||
spawn_local_scoped(cx, {
|
spawn_local_scoped(cx, {
|
||||||
async move {
|
async move {
|
||||||
sh.dispatch(cx, Message::LoadState);
|
sh.dispatch(cx, Message::LoadState);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user