diff --git a/src/pages/login.rs b/src/pages/login.rs index 7b9bffa..717e3a2 100644 --- a/src/pages/login.rs +++ b/src/pages/login.rs @@ -4,6 +4,7 @@ use leptos::leptos_dom::*; use leptos::*; use leptos_icons::*; use crate::users::UserCredentials; +use crate::components::loading::Loading; #[component] pub fn Login() -> impl IntoView { @@ -12,6 +13,9 @@ pub fn Login() -> impl IntoView { let (show_password, set_show_password) = create_signal(false); + let loading = create_rw_signal(false); + let error_msg = create_rw_signal(None); + let toggle_password = move |_| { set_show_password.update(|show_password| *show_password = !*show_password); log!("showing password"); @@ -24,6 +28,9 @@ pub fn Login() -> impl IntoView { let password1 = password.get(); spawn_local(async move { + loading.set(true); + error_msg.set(None); + let user_credentials = UserCredentials { username_or_email: username_or_email1, password: password1 @@ -35,6 +42,7 @@ 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); + error_msg.set(Some(err.to_string())); // Since we're not sure what the state is, manually refetch the user user.refetch(); @@ -48,10 +56,13 @@ pub fn Login() -> impl IntoView { log!("Navigated to home page after login"); } else if let Ok(None) = login_result { log!("Invalid username or password"); + error_msg.set(Some("Invalid username or password".to_string())); // User could be already logged in or not, so refetch the user user.refetch(); } + + loading.set(false); }); }; @@ -96,7 +107,13 @@ pub fn Login() -> impl IntoView { Forgot Password? - +
{ move || error_msg.get() }
+ } + > + + New here? Create an Account diff --git a/src/pages/signup.rs b/src/pages/signup.rs index 69fe77d..0d70d3f 100644 --- a/src/pages/signup.rs +++ b/src/pages/signup.rs @@ -4,6 +4,7 @@ use crate::util::state::GlobalState; use leptos::leptos_dom::*; use leptos::*; use leptos_icons::*; +use crate::components::loading::Loading; #[component] pub fn Signup() -> impl IntoView { @@ -13,6 +14,9 @@ pub fn Signup() -> impl IntoView { let (show_password, set_show_password) = create_signal(false); + let loading = create_rw_signal(false); + let error_msg = create_rw_signal(None); + let toggle_password = move |_| { set_show_password.update(|show_password| *show_password = !*show_password); log!("showing password"); @@ -30,12 +34,16 @@ pub fn Signup() -> impl IntoView { }; log!("new user: {:?}", new_user); + loading.set(true); + error_msg.set(None); + let user = GlobalState::logged_in_user(); spawn_local(async move { 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); + error_msg.set(Some(err.to_string())); // Since we're not sure what the state is, manually refetch the user user.refetch(); @@ -49,6 +57,8 @@ pub fn Signup() -> impl IntoView { leptos_router::use_navigate()("/", Default::default()); log!("Navigated to home page after signup") } + + loading.set(false); }); }; @@ -99,7 +109,13 @@ pub fn Signup() -> impl IntoView { - +
{ move || error_msg.get() }
+ } + > + + Already Have an Account? Go to Login diff --git a/style/login.scss b/style/login.scss index e694d3a..5680d91 100644 --- a/style/login.scss +++ b/style/login.scss @@ -8,7 +8,7 @@ top: 50%; left: 50%; width: 27rem; - height: 30rem; + height: 31rem; transform: translate(-50%, -50%); background: $auth-containers; z-index: 1; @@ -96,6 +96,17 @@ color: #fff; transition: all 0.2s; } +.login-form .error-msg { + color: $error-color; + margin-top: 1rem; + height: 1rem; +} +.login-form .loading { + margin-top: 4.5rem; + margin-left: auto; + margin-right: auto; + margin-bottom: calc(1.5rem - 10px); +} .login-form input[type="submit"] { margin-top: 3rem; width: 100%; diff --git a/style/signup.scss b/style/signup.scss index 30f87dc..9a82cbc 100644 --- a/style/signup.scss +++ b/style/signup.scss @@ -17,7 +17,7 @@ top: 50%; left: 50%; width: 27rem; - height: 35rem; + height: 36rem; transform: translate(-50%, -50%); background: $auth-containers; z-index: 1; @@ -92,7 +92,17 @@ .signup-form .input-box input:focus ~ i { height: 2.6rem; } - +.signup-form .error-msg { + color: $error-color; + margin-top: 1rem; + height: 1rem; +} +.signup-form .loading { + margin-top: 4.5rem; + margin-left: auto; + margin-right: auto; + margin-bottom: calc(1.5rem - 10px); +} .signup-form input[type="submit"] { margin-top: 3.5rem; width: 100%; diff --git a/style/theme.scss b/style/theme.scss index 0569ca6..d9d5ce5 100644 --- a/style/theme.scss +++ b/style/theme.scss @@ -12,6 +12,7 @@ $play-grad-start: #0a0533; $play-grad-end: $accent-color; $border-color: #7851ed; $queue-background-color: $play-bar-background-color; +$error-color: red; $auth-inputs: #796dd4; $auth-containers: white;