flams_router_base/
login_state.rs

1#[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}