use leptos::prelude::*; use leptos_router::hooks::use_navigate; use crate::api; use crate::i18n::*; #[component] pub fn AccountPage() -> impl IntoView { let i18n = use_i18n(); let auth_username = use_context::>>().expect("auth_username context not found"); let navigate = use_navigate(); Effect::new(move |_| { if let Some(u) = auth_username.get() { navigate(&format!("/profile/{u}"), Default::default()); } }); let tab = RwSignal::new("login"); view! {

{t!(i18n, account_title)}

{move || if tab.get() == "login" { view! { }.into_any() } else { view! { }.into_any() }}
} } #[component] fn LoginForm() -> impl IntoView { let i18n = use_i18n(); let auth_username = use_context::>>().expect("auth_username context not found"); let navigate = use_navigate(); let username = RwSignal::new(String::new()); let password = RwSignal::new(String::new()); let error = RwSignal::new(String::new()); let pending = RwSignal::new(false); let submit = move |ev: leptos::ev::SubmitEvent| { ev.prevent_default(); if pending.get() { return; } pending.set(true); error.set(String::new()); let u = username.get(); let p = password.get(); let navigate = navigate.clone(); wasm_bindgen_futures::spawn_local(async move { match api::post_login(&u, &p).await { Ok(me) => { let dest = format!("/profile/{}", me.username); auth_username.set(Some(me.username)); navigate(&dest, Default::default()); } Err(e) => { error.set(e); pending.set(false); } } }); }; view! {
{move || if !error.get().is_empty() { view! {

{ error.get() }

}.into_any() } else { view! { }.into_any() }} } } #[component] fn RegisterForm() -> impl IntoView { let i18n = use_i18n(); let auth_username = use_context::>>().expect("auth_username context not found"); let navigate = use_navigate(); let username = RwSignal::new(String::new()); let email = RwSignal::new(String::new()); let password = RwSignal::new(String::new()); let error = RwSignal::new(String::new()); let pending = RwSignal::new(false); let submit = move |ev: leptos::ev::SubmitEvent| { ev.prevent_default(); if pending.get() { return; } pending.set(true); error.set(String::new()); let u = username.get(); let e = email.get(); let p = password.get(); let navigate = navigate.clone(); wasm_bindgen_futures::spawn_local(async move { match api::post_register(&u, &e, &p).await { Ok(me) => { let dest = format!("/profile/{}", me.username); auth_username.set(Some(me.username)); navigate(&dest, Default::default()); } Err(err) => { error.set(err); pending.set(false); } } }); }; view! {
{move || if !error.get().is_empty() { view! {

{ error.get() }

}.into_any() } else { view! { }.into_any() }} } }