75 lines
2.4 KiB
Rust
75 lines
2.4 KiB
Rust
|
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()
|
||
|
}
|
||
|
}
|