From 2b380d77876cd7aef245a4ab1e2e5cf26b70ae9c Mon Sep 17 00:00:00 2001 From: Ethan Girouard Date: Sun, 3 Nov 2024 17:13:40 -0500 Subject: [PATCH] Refetch logged in user on login/signup --- src/app.rs | 4 ++-- src/pages/login.rs | 14 ++++++++++++-- src/pages/signup.rs | 14 +++++++++++--- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/app.rs b/src/app.rs index 9e91878..50cad40 100644 --- a/src/app.rs +++ b/src/app.rs @@ -59,8 +59,8 @@ pub fn App() -> impl IntoView { - - + } /> + } /> diff --git a/src/pages/login.rs b/src/pages/login.rs index 1fda5ca..585f2f0 100644 --- a/src/pages/login.rs +++ b/src/pages/login.rs @@ -3,9 +3,10 @@ use leptos::leptos_dom::*; use leptos::*; use leptos_icons::*; use crate::users::UserCredentials; +use crate::app::LoggedInUserResource; #[component] -pub fn Login() -> impl IntoView { +pub fn Login(user: LoggedInUserResource) -> impl IntoView { let (username_or_email, set_username_or_email) = create_signal("".to_string()); let (password, set_password) = create_signal("".to_string()); @@ -32,13 +33,22 @@ pub fn Login() -> impl IntoView { if let Err(err) = login_result { // Handle the error here, e.g., log it or display to the user log!("Error logging in: {:?}", err); - } else if let Ok(Some(_)) = login_result { + + // Since we're not sure what the state is, manually refetch the user + user.refetch(); + } else if let Ok(Some(login_user)) = login_result { + // Manually set the user to the new user, avoiding a refetch + user.set(Some(login_user)); + // Redirect to the login page log!("Logged in Successfully!"); leptos_router::use_navigate()("/", Default::default()); log!("Navigated to home page after login"); } else if let Ok(None) = login_result { log!("Invalid username or password"); + + // User could be already logged in or not, so refetch the user + user.refetch(); } }); }; diff --git a/src/pages/signup.rs b/src/pages/signup.rs index f02dfab..8e9a0ac 100644 --- a/src/pages/signup.rs +++ b/src/pages/signup.rs @@ -3,9 +3,10 @@ use crate::models::User; use leptos::leptos_dom::*; use leptos::*; use leptos_icons::*; +use crate::app::LoggedInUserResource; #[component] -pub fn Signup() -> impl IntoView { +pub fn Signup(user: LoggedInUserResource) -> impl IntoView { let (username, set_username) = create_signal("".to_string()); let (email, set_email) = create_signal("".to_string()); let (password, set_password) = create_signal("".to_string()); @@ -19,7 +20,7 @@ pub fn Signup() -> impl IntoView { let on_submit = move |ev: leptos::ev::SubmitEvent| { ev.prevent_default(); - let new_user = User { + let mut new_user = User { id: None, username: username.get(), email: email.get(), @@ -30,10 +31,17 @@ pub fn Signup() -> impl IntoView { log!("new user: {:?}", new_user); spawn_local(async move { - if let Err(err) = signup(new_user).await { + if let Err(err) = signup(new_user.clone()).await { // Handle the error here, e.g., log it or display to the user log!("Error signing up: {:?}", err); + + // Since we're not sure what the state is, manually refetch the user + user.refetch(); } else { + // Manually set the user to the new user, avoiding a refetch + new_user.password = None; + user.set(Some(new_user)); + // Redirect to the login page log!("Signed up successfully!"); leptos_router::use_navigate()("/", Default::default());