flams_router_base/
login_state.rs1#[derive(Clone, serde::Serialize, serde::Deserialize, Debug, PartialEq, Eq, strum::Display)]
2pub enum LoginState {
3 #[strum(to_string = "Loading")]
4 Loading,
5 #[strum(to_string = "Admin")]
6 Admin,
7 #[strum(to_string = "User {name}")]
8 User {
9 name: String,
10 avatar: String,
11 is_admin: bool,
12 },
13 #[strum(to_string = "None")]
14 None,
15 #[strum(to_string = "No accounts")]
16 NoAccounts,
17}
18impl LoginState {
19 #[inline]
20 #[must_use]
21 pub fn get() -> Self {
22 use leptos::prelude::*;
23 let ctx: RwSignal<Self> = expect_context();
24 ctx.get()
25 }
26}
27
28#[cfg(feature = "ssr")]
29mod server {
30 use flams_database::{DBBackend, DBUser};
31
32 use super::LoginState;
33
34 impl LoginState {
35 #[must_use]
36 pub fn get_server() -> Self {
37 let Some(session) =
38 leptos::prelude::use_context::<axum_login::AuthSession<DBBackend>>()
39 else {
40 return Self::None;
41 };
42 match &session.backend.admin {
43 None => Self::NoAccounts,
44 Some(_) => match session.user {
45 None => Self::None,
46 Some(DBUser {
47 id: 0, username, ..
48 }) if username == "admin" => Self::Admin,
49 Some(u) => Self::User {
50 name: u.username,
51 avatar: u.avatar_url.unwrap_or_default(),
52 is_admin: u.is_admin,
53 },
54 },
55 }
56 }
57 }
58}