hyaenidae/server/src/nav.rs

75 lines
2.4 KiB
Rust
Raw Normal View History

use crate::profiles::Profile;
use actix_web::{dev::Payload, FromRequest, HttpRequest};
use futures_core::future::LocalBoxFuture;
use hyaenidae_accounts::LogoutState;
use hyaenidae_toolkit::Button;
impl FromRequest for NavState {
type Config = ();
type Error = actix_web::Error;
type Future = LocalBoxFuture<'static, Result<Self, Self::Error>>;
fn from_request(req: &HttpRequest, _: &mut Payload) -> Self::Future {
let profile = Option::<Profile>::extract(req);
let logout = Option::<LogoutState>::extract(req);
Box::pin(async move {
let profile = profile.await?;
let logout = logout.await?;
let dark = true;
let mut nav = vec![];
if let Some(logout_state) = logout {
let home = Button::primary("Home");
let submission = Button::secondary("New Submission");
let settings = Button::secondary("Settings");
let logout = Button::primary_outline("Logout");
logout_state.button(&logout);
home.href("/").dark(dark);
submission.href("/submissions/create").dark(dark);
settings.href("/settings").dark(dark);
logout.dark(dark);
let profile = if let Some(profile) = profile {
let btn = Button::secondary("Profile");
btn.href(&profile.view_path()).dark(dark);
btn
} else {
let btn = Button::secondary("Switch Profile");
btn.href("/profiles/change");
btn
};
nav.push(home);
nav.push(submission);
nav.push(profile);
nav.push(settings);
nav.push(logout);
} else {
let login = Button::primary_outline("Login");
let register = Button::primary_outline("Register");
login.href("/session/auth/login").dark(dark);
register.href("/session/auth/register").dark(dark);
nav.push(login);
nav.push(register);
}
Ok(NavState { buttons: nav })
})
}
}
pub struct NavState {
buttons: Vec<Button>,
}
impl NavState {
pub(crate) fn buttons(&self) -> Vec<&Button> {
self.buttons.iter().collect()
}
}