entretien/src/web/mod.rs
2026-06-01 01:29:56 -05:00

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)
}
}
}
}
}
}