From 1ea5c8aafaf44a6d3b3674267156de09085853b2 Mon Sep 17 00:00:00 2001 From: traxys Date: Sun, 25 Jun 2023 22:02:58 +0200 Subject: [PATCH] app,server: Allow to edit steps --- api/src/lib.rs | 5 ++ app/src/recipe.rs | 117 +++++++++++++++++++++++++++++++++++++++++-- src/routes/mod.rs | 4 ++ src/routes/recipe.rs | 20 +++++++- 4 files changed, 141 insertions(+), 5 deletions(-) diff --git a/api/src/lib.rs b/api/src/lib.rs index bab7f5c..bd1dd03 100644 --- a/api/src/lib.rs +++ b/api/src/lib.rs @@ -123,3 +123,8 @@ pub struct RecipeIngredientEditRequest { pub struct AddRecipeIngredientRequest { pub amount: f64, } + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct RecipeEditStepsRequest { + pub steps: String +} diff --git a/app/src/recipe.rs b/app/src/recipe.rs index c72d5e1..008652a 100644 --- a/app/src/recipe.rs +++ b/app/src/recipe.rs @@ -1,11 +1,11 @@ use api::{ - AddRecipeIngredientRequest, IngredientInfo, RecipeInfo, RecipeIngredientEditRequest, - RecipeRenameRequest, + AddRecipeIngredientRequest, IngredientInfo, RecipeEditStepsRequest, RecipeInfo, + RecipeIngredientEditRequest, RecipeRenameRequest, }; use itertools::Itertools; use uuid::Uuid; use wasm_bindgen::JsCast; -use web_sys::HtmlInputElement; +use web_sys::{HtmlInputElement, HtmlTextAreaElement}; use yew::{ prelude::*, suspense::{use_future, use_future_with_deps}, @@ -519,6 +519,110 @@ async fn do_delete_ig( Ok(()) } +async fn do_edit_steps( + token: String, + household: Uuid, + recipe: i64, + steps: String, +) -> anyhow::Result<()> { + let rsp = gloo_net::http::Request::patch(api!("household/{household}/recipe/{recipe}/steps")) + .json(&RecipeEditStepsRequest { steps })? + .header("Authorization", &format!("Bearer {token}")) + .send() + .await?; + + if !rsp.ok() { + let body = rsp.text().await.unwrap_or_default(); + anyhow::bail!("Could not get recipes (code={}): {body}", rsp.status()); + } + + Ok(()) +} + +#[derive(Properties, PartialEq, Clone)] +struct EditStepsProps { + token: String, + household: Uuid, + recipe: i64, + steps: String, + update: Callback<()>, +} + +#[function_component] +fn EditSteps(props: &EditStepsProps) -> Html { + let steps = use_state(|| props.steps.clone()); + + let error = use_state(|| None::); + + let onchange = { + let steps = steps.clone(); + Callback::from(move |e: Event| { + let Some(target) = e.target() else { + return; + }; + + let Ok(target) = target.dyn_into::() else { + return; + }; + + steps.set(target.value()); + }) + }; + let on_submit = { + let steps = steps.clone(); + let token = props.token.clone(); + let household = props.household; + let recipe = props.recipe; + let error = error.clone(); + let update = props.update.clone(); + Callback::from(move |_| { + let token = token.clone(); + let steps = steps.clone(); + let error = error.clone(); + let update = update.clone(); + + wasm_bindgen_futures::spawn_local(async move { + match do_edit_steps(token.clone(), household, recipe, (*steps).clone()).await { + Ok(_) => { + let modal = bs::Modal::get_instance("#rcpEditSteps"); + modal.hide(); + error.set(None); + update.emit(()); + } + Err(e) => { + error.set(Some(format!("Could not edit steps: {e}"))); + } + } + }); + }) + }; + + html! {<> + + {"Edit Steps"} + + + if let Some(e) = &*error { + + } +