From f88aecd306d80b002bfa09ef2ab59202c6e3562e Mon Sep 17 00:00:00 2001 From: traxys Date: Mon, 29 May 2023 19:30:47 +0200 Subject: [PATCH] app: Allow to add a member to existing households --- app/src/sidebar.rs | 95 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 94 insertions(+), 1 deletion(-) diff --git a/app/src/sidebar.rs b/app/src/sidebar.rs index bcc0be3..86670ca 100644 --- a/app/src/sidebar.rs +++ b/app/src/sidebar.rs @@ -1,9 +1,15 @@ use gloo_storage::{LocalStorage, Storage}; use uuid::Uuid; +use wasm_bindgen::JsCast; +use web_sys::HtmlInputElement; use yew::prelude::*; use yew_router::prelude::*; -use crate::{api, bootstrap::ConfirmDangerModal, RegaladeGlobalState, Route}; +use crate::{ + api, + bootstrap::{bs, ConfirmDangerModal, FormModal}, + do_add_user_to_household, do_resolve_user, RegaladeGlobalState, Route, +}; #[derive(PartialEq)] struct MenuEntry { @@ -38,6 +44,79 @@ async fn do_leave(token: String, household: Uuid) -> anyhow::Result<()> { Ok(()) } +#[derive(PartialEq, Properties)] +struct AddMemberProps { + token: String, + household: Uuid, +} + +#[function_component] +fn AddMemberModal(props: &AddMemberProps) -> Html { + let error = use_state(|| None::); + let err = error.clone(); + let token = props.token.clone(); + let household = props.household; + let add_member = Callback::from(move |_| { + let document = gloo_utils::document(); + + let name: HtmlInputElement = document + .get_element_by_id("addMemberName") + .unwrap() + .dyn_into() + .expect("addMemberName is not an input element"); + let name = name.value(); + + let err = err.clone(); + let token = token.clone(); + + wasm_bindgen_futures::spawn_local(async move { + match do_resolve_user(token.clone(), name.clone()).await { + Ok(Some(uid)) => match do_add_user_to_household(token, household, uid).await { + Err(e) => { + err.set(Some(format!("Could not add user: {e:?}"))); + } + Ok(_) => { + err.set(None); + + let modal = bs::Modal::get_instance("#addMember"); + modal.hide(); + } + }, + Ok(None) => { + err.set(Some(format!("User '{name}' does not exist"))); + } + Err(e) => { + err.set(Some(format!("Could not resolve user '{name}': {e:?}"))); + } + } + }) + }); + + html! { + + if let Some(err) = &*error { + + } +
+ + +
+
+ } +} + #[function_component] fn Sidebar(props: &SidebarProps) -> Html { let global_state = use_state(RegaladeGlobalState::get); @@ -161,6 +240,10 @@ fn Sidebar(props: &SidebarProps) -> Html { > {format!("Are you sure you want to leave the household '{}' ?", global_state.household.name)} +