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 for Layout { type Rejection = AppError; async fn from_request_parts( parts: &mut Parts, _state: &AppState, ) -> Result { let auth_session = parts .extract::() .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, css: Option>, 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) } } } } } }