use crate::i18n; use leptos::prelude::*; use wasm_bindgen_futures::spawn_local; use crate::api::{self, Me, input_value}; use crate::app::AuthPhase; use crate::components::logo::Logo; #[component] pub fn LoginView( set_me: WriteSignal>, set_phase: WriteSignal, ) -> impl IntoView { let (error, set_error) = signal(String::new()); let (busy, set_busy) = signal(false); let on_submit = move |ev: web_sys::SubmitEvent| { ev.prevent_default(); let name = input_value("login-name"); let pass = input_value("login-pass"); if name.trim().is_empty() || pass.is_empty() { set_error.set(i18n::t(i18n::k::LOGIN_ERROR).into()); return; } set_error.set(String::new()); set_busy.set(true); let name = name.trim().to_string(); spawn_local(async move { match api::login(name, pass).await { Ok(_) => match api::me().await { Ok(m) => { // Keep the current hash: deep links (e.g. #/users) survive // the sign-in. A non-admin landing on an admin section is // redirected to the files view by the shell instead. set_me.set(Some(m)); set_phase.set(AuthPhase::Authed); } Err(e) => { set_error.set(e.to_string()); set_busy.set(false); } }, Err(e) => { set_error.set(e.to_string()); set_busy.set(false); } } }); }; view! {
} }