-module(dreki_web_ui). -export([render/3, reply_html/3, reply_html/4]). render(Req, InnerModule, Assigns0) -> Assigns = assigns(Req, Assigns0), {ok, InnerHtml} = InnerModule:render(Assigns), render_layout(Req, InnerHtml, Assigns). reply_html(Req, Code, Html) -> reply_html(Req, Code, Html, #{}). reply_html(Req, Code, Html, Headers0) -> Headers = maps:put(<<"content-type">>, <<"text/html">>, Headers0), cowboy_req:reply(Code, Headers, Html, Req). render_layout(Req, InnerHtml, Assigns) -> {ok, Html} = layout_dtl:render([{"inner", InnerHtml} | Assigns]), Html. assigns(Req, Assigns0) -> Assigns = clean_assigns(Assigns0), [{"site_title", "Dreki"}, {"identity_id", maps:get(identity_id, Req)}, {"identity", maps:get(identity, Req)}, {"identity_name", dreki_web:identity_name(Req)}, {"dreki_node", node()}, {"dreki_world", dreki_world:to_map()}, {"trace_id", maps:get(<<"trace-id">>, Req, <<"no-trace">>)} | Assigns]. content_types_accepted(Req, State) -> {[ {{ <<"multipart">>, <<"form-data">>, '*'}, from_form} ], Req, State}. content_types_provided(Req, State) -> {[{{ <<"text">>, <<"html">>, '*'}, to_html}], Req, State}. clean_assigns(Assigns) when is_list(Assigns) -> Assigns; clean_assigns(Map) when is_map(Map) -> maps:fold(fun (Key, Value, Acc) -> [{Key, clean_assigns(Value)} | Acc] end, [], Map); clean_assigns(Other) -> Other.