diff --git a/src/auth.rs b/src/auth.rs index 37f861f..d0c0f1c 100644 --- a/src/auth.rs +++ b/src/auth.rs @@ -137,7 +137,7 @@ pub async fn require_auth() -> Result<(), ServerFnError> { /// Ok(()) /// } /// ``` -#[cfg(feature = "ssr")] +#[server(endpoint = "get_user")] pub async fn get_user() -> Result { let auth_session = extract::>().await .map_err(|e| ServerFnError::::ServerError(format!("Error getting auth session: {}", e)))?; diff --git a/src/components/personal.rs b/src/components/personal.rs index 48ee134..a7c4141 100644 --- a/src/components/personal.rs +++ b/src/components/personal.rs @@ -1,6 +1,9 @@ use leptos::leptos_dom::*; use leptos::*; use leptos_icons::*; +use crate::auth::get_user; +use crate::auth::logout; +use crate::models::User; #[component] pub fn Personal() -> impl IntoView { @@ -14,18 +17,38 @@ pub fn Personal() -> impl IntoView { #[component] pub fn Profile() -> impl IntoView { 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 |_| { - set_dropdown_open.update(|value| *value = !*value); - log!("opened dropdown"); + 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); + }); }; + view! {
} @@ -40,3 +63,26 @@ pub fn DropDownNotLoggedIn() -> impl IntoView { } } +#[component] +pub fn DropDownLoggedIn(user_signal: RwSignal, logged_in: RwSignal) -> 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! { + + } +} diff --git a/src/models.rs b/src/models.rs index b96c8d2..59baec3 100644 --- a/src/models.rs +++ b/src/models.rs @@ -25,7 +25,7 @@ cfg_if! { #[cfg_attr(feature = "ssr", derive(Queryable, Selectable, Insertable))] #[cfg_attr(feature = "ssr", diesel(table_name = crate::schema::users))] #[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 { /// A unique id for the user #[cfg_attr(feature = "ssr", diesel(deserialize_as = i32))] diff --git a/src/users.rs b/src/users.rs index 2d61c69..387dfcd 100644 --- a/src/users.rs +++ b/src/users.rs @@ -117,7 +117,7 @@ pub async fn validate_user(credentials: UserCredentials) -> Result, /// 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 -#[server(endpoint = "get_user")] +#[server(endpoint = "find_user")] pub async fn get_user(username_or_email: String) -> Result, ServerFnError> { let mut user = find_user(username_or_email).await?;