Detect user logged in and display "logged in" for profile
This commit is contained in:
parent
ab50826d31
commit
3149f65a97
@ -137,7 +137,7 @@ pub async fn require_auth() -> Result<(), ServerFnError> {
|
|||||||
/// Ok(())
|
/// Ok(())
|
||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
#[cfg(feature = "ssr")]
|
#[server(endpoint = "get_user")]
|
||||||
pub async fn get_user() -> Result<User, ServerFnError> {
|
pub async fn get_user() -> Result<User, ServerFnError> {
|
||||||
let auth_session = extract::<AuthSession<AuthBackend>>().await
|
let auth_session = extract::<AuthSession<AuthBackend>>().await
|
||||||
.map_err(|e| ServerFnError::<NoCustomError>::ServerError(format!("Error getting auth session: {}", e)))?;
|
.map_err(|e| ServerFnError::<NoCustomError>::ServerError(format!("Error getting auth session: {}", e)))?;
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
use leptos::leptos_dom::*;
|
use leptos::leptos_dom::*;
|
||||||
use leptos::*;
|
use leptos::*;
|
||||||
use leptos_icons::*;
|
use leptos_icons::*;
|
||||||
|
use crate::auth::get_user;
|
||||||
|
use crate::auth::logout;
|
||||||
|
use crate::models::User;
|
||||||
|
|
||||||
#[component]
|
#[component]
|
||||||
pub fn Personal() -> impl IntoView {
|
pub fn Personal() -> impl IntoView {
|
||||||
@ -14,18 +17,38 @@ pub fn Personal() -> impl IntoView {
|
|||||||
#[component]
|
#[component]
|
||||||
pub fn Profile() -> impl IntoView {
|
pub fn Profile() -> impl IntoView {
|
||||||
let (dropdown_open, set_dropdown_open) = create_signal(false);
|
let (dropdown_open, set_dropdown_open) = create_signal(false);
|
||||||
|
let logged_in = create_rw_signal(false);
|
||||||
|
|
||||||
|
let user_signal = create_rw_signal(User::default());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let open_dropdown = move |_| {
|
let open_dropdown = move |_| {
|
||||||
|
spawn_local(async move {
|
||||||
|
let user = get_user().await;
|
||||||
|
if let Ok(user) = user {
|
||||||
|
logged_in.set(true);
|
||||||
|
user_signal.update(|value| *value = user);
|
||||||
|
} else {
|
||||||
|
logged_in.set(false);
|
||||||
|
}
|
||||||
set_dropdown_open.update(|value| *value = !*value);
|
set_dropdown_open.update(|value| *value = !*value);
|
||||||
log!("opened dropdown");
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
<div class="profile-container">
|
<div class="profile-container">
|
||||||
<div class="profile-icon" on:click=open_dropdown>
|
<div class="profile-icon" on:click=open_dropdown>
|
||||||
<Icon icon=icondata::CgProfile />
|
<Icon icon=icondata::CgProfile />
|
||||||
</div>
|
</div>
|
||||||
<div class="dropdown-container" style={move || if dropdown_open() {"display: flex"} else {"display: none"}}>
|
<div class="dropdown-container" style={move || if dropdown_open() {"display: flex"} else {"display: none"}}>
|
||||||
|
<Show
|
||||||
|
when=logged_in
|
||||||
|
fallback=|| view!{
|
||||||
<DropDownNotLoggedIn />
|
<DropDownNotLoggedIn />
|
||||||
|
}>
|
||||||
|
<DropDownLoggedIn user_signal=user_signal logged_in=logged_in></DropDownLoggedIn>
|
||||||
|
</Show>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
@ -40,3 +63,26 @@ pub fn DropDownNotLoggedIn() -> impl IntoView {
|
|||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[component]
|
||||||
|
pub fn DropDownLoggedIn(user_signal: RwSignal<User>, logged_in: RwSignal<bool>) -> impl IntoView {
|
||||||
|
|
||||||
|
let logout = move |_| {
|
||||||
|
spawn_local(async move {
|
||||||
|
let result = logout().await;
|
||||||
|
if let Err(err) = result {
|
||||||
|
log!("Error logging out: {:?}", err);
|
||||||
|
} else {
|
||||||
|
log!("Logged out successfully");
|
||||||
|
user_signal.update(|value| *value = User::default());
|
||||||
|
logged_in.set(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
view! {
|
||||||
|
<div class="dropdown-logged">
|
||||||
|
<h1>"Logged In"</h1>
|
||||||
|
<button on:click=logout class="auth-button">Log Out</button>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -25,7 +25,7 @@ cfg_if! {
|
|||||||
#[cfg_attr(feature = "ssr", derive(Queryable, Selectable, Insertable))]
|
#[cfg_attr(feature = "ssr", derive(Queryable, Selectable, Insertable))]
|
||||||
#[cfg_attr(feature = "ssr", diesel(table_name = crate::schema::users))]
|
#[cfg_attr(feature = "ssr", diesel(table_name = crate::schema::users))]
|
||||||
#[cfg_attr(feature = "ssr", diesel(check_for_backend(diesel::pg::Pg)))]
|
#[cfg_attr(feature = "ssr", diesel(check_for_backend(diesel::pg::Pg)))]
|
||||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
|
||||||
pub struct User {
|
pub struct User {
|
||||||
/// A unique id for the user
|
/// A unique id for the user
|
||||||
#[cfg_attr(feature = "ssr", diesel(deserialize_as = i32))]
|
#[cfg_attr(feature = "ssr", diesel(deserialize_as = i32))]
|
||||||
|
@ -117,7 +117,7 @@ pub async fn validate_user(credentials: UserCredentials) -> Result<Option<User>,
|
|||||||
|
|
||||||
/// Get a user from the database by username or email
|
/// Get a user from the database by username or email
|
||||||
/// Returns a Result with the user if found, None if not found, or an error if there was a problem
|
/// Returns a Result with the user if found, None if not found, or an error if there was a problem
|
||||||
#[server(endpoint = "get_user")]
|
#[server(endpoint = "find_user")]
|
||||||
pub async fn get_user(username_or_email: String) -> Result<Option<User>, ServerFnError> {
|
pub async fn get_user(username_or_email: String) -> Result<Option<User>, ServerFnError> {
|
||||||
let mut user = find_user(username_or_email).await?;
|
let mut user = find_user(username_or_email).await?;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user