use web_sys::HtmlInputElement; use yew::prelude::*; use crate::api; #[derive(Properties, PartialEq)] pub struct Props { pub on_setup: Callback<()>, } #[function_component(SetupPage)] pub fn setup_page(props: &Props) -> Html { let username = use_state(String::new); let password = use_state(String::new); let confirm = use_state(String::new); let error = use_state(|| None::); let on_submit = { let username = username.clone(); let password = password.clone(); let confirm = confirm.clone(); let error = error.clone(); let on_setup = props.on_setup.clone(); Callback::from(move |e: SubmitEvent| { e.prevent_default(); let u = (*username).clone(); let p = (*password).clone(); let c = (*confirm).clone(); let error = error.clone(); let on_setup = on_setup.clone(); if p != c { error.set(Some("Passwords do not match".into())); return; } if p.len() < 4 { error.set(Some("Password must be at least 4 characters".into())); return; } wasm_bindgen_futures::spawn_local(async move { match api::setup(&u, &p).await { Ok(_) => on_setup.emit(()), Err(e) => error.set(Some(e.0)), } }); }) }; html! {

{ "Shanty" }

{ "Create your admin account to get started" }

if let Some(ref err) = *error {
{ err }
}
} }