Add loading and error messages to login page
This commit is contained in:
parent
9b48fc0204
commit
930618dcad
@ -4,6 +4,7 @@ use leptos::leptos_dom::*;
|
|||||||
use leptos::*;
|
use leptos::*;
|
||||||
use leptos_icons::*;
|
use leptos_icons::*;
|
||||||
use crate::users::UserCredentials;
|
use crate::users::UserCredentials;
|
||||||
|
use crate::components::loading::Loading;
|
||||||
|
|
||||||
#[component]
|
#[component]
|
||||||
pub fn Login() -> impl IntoView {
|
pub fn Login() -> impl IntoView {
|
||||||
@ -12,6 +13,9 @@ pub fn Login() -> impl IntoView {
|
|||||||
|
|
||||||
let (show_password, set_show_password) = create_signal(false);
|
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 |_| {
|
let toggle_password = move |_| {
|
||||||
set_show_password.update(|show_password| *show_password = !*show_password);
|
set_show_password.update(|show_password| *show_password = !*show_password);
|
||||||
log!("showing password");
|
log!("showing password");
|
||||||
@ -24,6 +28,9 @@ pub fn Login() -> impl IntoView {
|
|||||||
let password1 = password.get();
|
let password1 = password.get();
|
||||||
|
|
||||||
spawn_local(async move {
|
spawn_local(async move {
|
||||||
|
loading.set(true);
|
||||||
|
error_msg.set(None);
|
||||||
|
|
||||||
let user_credentials = UserCredentials {
|
let user_credentials = UserCredentials {
|
||||||
username_or_email: username_or_email1,
|
username_or_email: username_or_email1,
|
||||||
password: password1
|
password: password1
|
||||||
@ -35,6 +42,7 @@ 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);
|
||||||
|
error_msg.set(Some(err.to_string()));
|
||||||
|
|
||||||
// Since we're not sure what the state is, manually refetch the user
|
// Since we're not sure what the state is, manually refetch the user
|
||||||
user.refetch();
|
user.refetch();
|
||||||
@ -48,10 +56,13 @@ pub fn Login() -> impl IntoView {
|
|||||||
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");
|
||||||
|
error_msg.set(Some("Invalid username or password".to_string()));
|
||||||
|
|
||||||
// User could be already logged in or not, so refetch the user
|
// User could be already logged in or not, so refetch the user
|
||||||
user.refetch();
|
user.refetch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loading.set(false);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -96,7 +107,13 @@ pub fn Login() -> impl IntoView {
|
|||||||
</Show>
|
</Show>
|
||||||
</div>
|
</div>
|
||||||
<a href="" class="forgot-pw">Forgot Password?</a>
|
<a href="" class="forgot-pw">Forgot Password?</a>
|
||||||
<input type="submit" value="Login" />
|
<div class="error-msg" >{ move || error_msg.get() }</div>
|
||||||
|
<Show
|
||||||
|
when=move || !loading.get()
|
||||||
|
fallback=move || view! { <Loading /> }
|
||||||
|
>
|
||||||
|
<input type="submit" value="Login" />
|
||||||
|
</Show>
|
||||||
<span class="go-to-signup">
|
<span class="go-to-signup">
|
||||||
New here? <a href="/signup">Create an Account</a>
|
New here? <a href="/signup">Create an Account</a>
|
||||||
</span>
|
</span>
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
top: 50%;
|
top: 50%;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
width: 27rem;
|
width: 27rem;
|
||||||
height: 30rem;
|
height: 31rem;
|
||||||
transform: translate(-50%, -50%);
|
transform: translate(-50%, -50%);
|
||||||
background: $auth-containers;
|
background: $auth-containers;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
@ -96,6 +96,17 @@
|
|||||||
color: #fff;
|
color: #fff;
|
||||||
transition: all 0.2s;
|
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"] {
|
.login-form input[type="submit"] {
|
||||||
margin-top: 3rem;
|
margin-top: 3rem;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -12,6 +12,7 @@ $play-grad-start: #0a0533;
|
|||||||
$play-grad-end: $accent-color;
|
$play-grad-end: $accent-color;
|
||||||
$border-color: #7851ed;
|
$border-color: #7851ed;
|
||||||
$queue-background-color: $play-bar-background-color;
|
$queue-background-color: $play-bar-background-color;
|
||||||
|
$error-color: red;
|
||||||
|
|
||||||
$auth-inputs: #796dd4;
|
$auth-inputs: #796dd4;
|
||||||
$auth-containers: white;
|
$auth-containers: white;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user