rumtk_web/components/app/
app_body.rs1use crate::components::app::app_footer::app_footer;
22use crate::components::app::app_nav::app_nav;
23use crate::components::html::main;
24use crate::utils::defaults::DEFAULT_EMPTY_PARAMS;
25use crate::utils::types::{SharedAppState, URLParams, URLPath};
26use crate::{rumtk_web_get_config, sanitize_html, ComponentResult, RUMWebTemplate, RUMWebTemplateSafe};
27use rumtk_core::strings::RUMString;
28
29#[derive(RUMWebTemplate)]
30#[template(
31 source = "
32 <body class='f12 fw300 theme-{{theme}}'>
33 <a href='#main-content header' hidden>Skip to main content</a>
34 {{header|safe}}
35 {{main|safe}}
36 {{footer|safe}}
37 </body>
38 ",
39 ext = "html"
40)]
41pub struct AppBody {
42 theme: RUMString,
43 header: RUMString,
44 main: RUMString,
45 footer: RUMString,
46}
47
48impl RUMWebTemplateSafe for AppBody {}
49
50pub fn app_body<'a>(path_components: URLPath<'a, 'a>, params: URLParams<'a>, state: SharedAppState) -> ComponentResult<AppBody> {
51 let theme = rumtk_web_get_config!(state).theme.clone();
52
53 let header = app_nav(path_components, DEFAULT_EMPTY_PARAMS.get_inner(), state.clone())?;
56 let main = main(path_components, DEFAULT_EMPTY_PARAMS.get_inner(), state.clone())?;
57 let footer = app_footer(
59 path_components,
60 params,
61 state
62 )?;
63
64 let rendered_header = sanitize_html(&header.to_string(), true);
66 let rendered_main = sanitize_html(&main.to_string(), true);
67 let rendered_footer = sanitize_html(&footer.to_string(), true);
68
69 Ok(AppBody {
70 theme,
71 header: rendered_header,
72 main: rendered_main,
73 footer: rendered_footer,
74 })
75}