79 lines
2.7 KiB
Rust
79 lines
2.7 KiB
Rust
use axum::RequestPartsExt;
|
|
use axum::extract::FromRequestParts;
|
|
use cache_bust::asset;
|
|
use http::request::Parts;
|
|
use maud::{DOCTYPE, Markup, html};
|
|
use serde_json::json;
|
|
|
|
use super::models::user::{AuthSession, User};
|
|
use super::{AppError, AppState};
|
|
// use crate::db::DbId;
|
|
|
|
pub mod auth;
|
|
pub mod home;
|
|
pub mod settings;
|
|
pub mod task;
|
|
|
|
#[derive(Debug)]
|
|
pub struct Layout {
|
|
user: User,
|
|
}
|
|
|
|
impl FromRequestParts<AppState> for Layout {
|
|
type Rejection = AppError;
|
|
|
|
async fn from_request_parts(
|
|
parts: &mut Parts,
|
|
_state: &AppState,
|
|
) -> Result<Self, Self::Rejection> {
|
|
let auth_session = parts
|
|
.extract::<AuthSession>()
|
|
.await
|
|
.map_err(|_| anyhow::Error::msg("could not get session"))?;
|
|
let user = auth_session.user.unwrap();
|
|
|
|
Ok(Layout { user })
|
|
}
|
|
}
|
|
|
|
impl Layout {
|
|
pub fn render(
|
|
&self,
|
|
title: impl AsRef<str>,
|
|
css: Option<Vec<&str>>,
|
|
content: Markup,
|
|
) -> Markup {
|
|
html! {
|
|
(DOCTYPE)
|
|
html {
|
|
head {
|
|
title { (format!("{} | Entretien", title.as_ref())) }
|
|
// link rel="apple-touch-icon" sizes="180x180" href=(format!("/static/{}", asset!("apple-touch-icon.png")));
|
|
// link rel="icon" type="image/png" sizes="32x32" href=(format!("/static/{}", asset!("favicon-32x32.png")));
|
|
// link rel="icon" type="image/png" sizes="16x16" href=(format!("/static/{}", asset!("favicon-16x16.png")));
|
|
// link rel="manifest" href=(format!("/static/{}", asset!("site.webmanifest")));
|
|
link rel="stylesheet" type="text/css" href=(format!("/static/{}", asset!("index.css")));
|
|
meta name="viewport" content="width=device-width";
|
|
meta name="htmx-config" content=(json!({"responseTargetUnsetsError": "false"}));
|
|
script defer src=(format!("/static/{}", asset!("htmx_2.0.7.min.js"))) {}
|
|
script defer src=(format!("/static/{}", asset!("htmx-ext-response-targets_2.0.4.min.js"))) {}
|
|
script defer src=(format!("/static/{}", asset!("alpine_3.15.12.min.js"))) {}
|
|
@if let Some(hrefs) = css {
|
|
@for href in hrefs {
|
|
link rel="stylesheet" type="text/css" href=(format!("/static/{}", href));
|
|
}
|
|
}
|
|
}
|
|
body {
|
|
nav {
|
|
a href="/logout" { "logout of " (self.user.username) }
|
|
}
|
|
main {
|
|
(content)
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|