diff --git a/assets/styles/dashboard.css b/assets/styles/dashboard.css index 06ef5aa..874eb03 100644 --- a/assets/styles/dashboard.css +++ b/assets/styles/dashboard.css @@ -251,8 +251,7 @@ body { } .search-container button { - background-color: transparent; - border: 1px solid currentColor; + border: 0; border-radius: 6px; outline: none; white-space: nowrap; diff --git a/assets/styles/server.css b/assets/styles/server.css index 4b2fd8f..21a1869 100644 --- a/assets/styles/server.css +++ b/assets/styles/server.css @@ -114,6 +114,11 @@ gap: 6px; } +.All { + color: var(--fg); + background-color: var(--bg); +} + .Online { color: var(--online); background-color: var(--online-bg); diff --git a/src/backend/auth.rs b/src/backend/auth.rs index 8762549..1a740b4 100644 --- a/src/backend/auth.rs +++ b/src/backend/auth.rs @@ -62,3 +62,8 @@ pub async fn validate_session(id: String) -> bool { false } } + +#[server] +pub async fn check_validate_session(id: String) -> Result { + Ok(validate_session(id).await) +} diff --git a/src/dashboard.rs b/src/dashboard.rs index 1423380..e4056db 100644 --- a/src/dashboard.rs +++ b/src/dashboard.rs @@ -98,11 +98,11 @@ pub fn Dashboard() -> Element { placeholder: "Search servers by name, location, or IP..." } } - button { class: "fg", "All (4)" } - button { class: "online", "Online (3)" } - button { class: "issues", "Warning (1)" } - button { class: "ram", "Offline (1)" } - button { class: "cpu", "Maintenance (1)" } + button { class: "All", "All (4)" } + button { class: "Online", "Online (3)" } + button { class: "Warning", "Warning (1)" } + button { class: "Offline", "Offline (1)" } + button { class: "Maintenance", "Maintenance (1)" } } div { class: "server-container", diff --git a/src/login.rs b/src/login.rs index fd1bcb0..8c6a5a1 100644 --- a/src/login.rs +++ b/src/login.rs @@ -1,6 +1,9 @@ use dioxus::prelude::*; -use crate::{backend, utils}; +use crate::{ + backend::{self}, + utils::{self}, +}; const LOGIN_CSS: Asset = asset!("/assets/styles/login.css"); @@ -9,6 +12,24 @@ pub fn Login() -> Element { let username = use_signal(|| String::new()); let password = use_signal(|| String::new()); let error: Signal> = use_signal(|| None); + let session = utils::use_session(); + + // Check for existing session on mount + use_effect({ + let session = session.clone(); + move || { + let session = session.clone(); + spawn(async move { + // Optional: verify with the server if session is actually valid + if backend::auth::check_validate_session(session.get_id()) + .await + .unwrap_or(false) + { + utils::redirect("/dashboard"); + } + }); + } + }); let is_disabled = { let username = username.clone(); diff --git a/src/utils.rs b/src/utils.rs index b4751f7..5fde736 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -66,6 +66,7 @@ pub fn redirect(target: &str) { .unwrap(); } +#[derive(Clone)] pub struct Session(Signal); pub fn use_session() -> Session { @@ -73,6 +74,10 @@ pub fn use_session() -> Session { } impl Session { + pub fn get_id(&self) -> String { + self.0.read().clone() + } + pub fn use_servers(&self) -> (Signal>, Signal) { let query = use_signal(|| String::new()); let servers = use_signal(|| Vec::new()); @@ -83,7 +88,7 @@ impl Session { let mut servers = servers.clone(); spawn(async move { - if let Ok(v) = backend::get_servers(id.read().clone(), query_value).await { + if let Ok(v) = request(backend::get_servers(id.read().clone(), query_value).await) { servers.set(v); } }); @@ -92,3 +97,20 @@ impl Session { (servers, query) } } + +pub fn request(o: Result) -> Result { + match o { + Err(e) => match e { + ServerFnError::ServerError(e) => { + if e == "Invalid session" { + redirect("/"); + Err(ServerFnError::ServerError(e)) + } else { + Err(ServerFnError::ServerError(e)) + } + } + _ => Err(e), + }, + _ => o, + } +}