Refetch logged in user on login/signup

This commit is contained in:
Ethan Girouard 2024-11-03 17:13:40 -05:00
parent 8ac3a87c58
commit 2b380d7787
Signed by: eta357
GPG Key ID: 7BCDC36DFD11C146
3 changed files with 25 additions and 7 deletions

View File

@ -59,8 +59,8 @@ pub fn App() -> impl IntoView {
<Route path="dashboard" view=Dashboard /> <Route path="dashboard" view=Dashboard />
<Route path="search" view=Search /> <Route path="search" view=Search />
</Route> </Route>
<Route path="/login" view=Login /> <Route path="/login" view=move || view!{ <Login user=logged_in_user /> } />
<Route path="/signup" view=Signup /> <Route path="/signup" view=move || view!{ <Signup user=logged_in_user /> } />
</Routes> </Routes>
</main> </main>
</Router> </Router>

View File

@ -3,9 +3,10 @@ use leptos::leptos_dom::*;
use leptos::*; use leptos::*;
use leptos_icons::*; use leptos_icons::*;
use crate::users::UserCredentials; use crate::users::UserCredentials;
use crate::app::LoggedInUserResource;
#[component] #[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 (username_or_email, set_username_or_email) = create_signal("".to_string());
let (password, set_password) = 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 { if let Err(err) = login_result {
// Handle the error here, e.g., log it or display to the user // Handle the error here, e.g., log it or display to the user
log!("Error logging in: {:?}", err); 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 // Redirect to the login page
log!("Logged in Successfully!"); log!("Logged in Successfully!");
leptos_router::use_navigate()("/", Default::default()); leptos_router::use_navigate()("/", Default::default());
log!("Navigated to home page after login"); log!("Navigated to home page after login");
} else if let Ok(None) = login_result { } else if let Ok(None) = login_result {
log!("Invalid username or password"); log!("Invalid username or password");
// User could be already logged in or not, so refetch the user
user.refetch();
} }
}); });
}; };

View File

@ -3,9 +3,10 @@ use crate::models::User;
use leptos::leptos_dom::*; use leptos::leptos_dom::*;
use leptos::*; use leptos::*;
use leptos_icons::*; use leptos_icons::*;
use crate::app::LoggedInUserResource;
#[component] #[component]
pub fn Signup() -> impl IntoView { pub fn Signup(user: LoggedInUserResource) -> impl IntoView {
let (username, set_username) = create_signal("".to_string()); let (username, set_username) = create_signal("".to_string());
let (email, set_email) = create_signal("".to_string()); let (email, set_email) = create_signal("".to_string());
let (password, set_password) = 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| { let on_submit = move |ev: leptos::ev::SubmitEvent| {
ev.prevent_default(); ev.prevent_default();
let new_user = User { let mut new_user = User {
id: None, id: None,
username: username.get(), username: username.get(),
email: email.get(), email: email.get(),
@ -30,10 +31,17 @@ pub fn Signup() -> impl IntoView {
log!("new user: {:?}", new_user); log!("new user: {:?}", new_user);
spawn_local(async move { 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 // Handle the error here, e.g., log it or display to the user
log!("Error signing up: {:?}", err); log!("Error signing up: {:?}", err);
// Since we're not sure what the state is, manually refetch the user
user.refetch();
} else { } 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 // Redirect to the login page
log!("Signed up successfully!"); log!("Signed up successfully!");
leptos_router::use_navigate()("/", Default::default()); leptos_router::use_navigate()("/", Default::default());